package cn.soft863.common.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;

/**
 * jdbc封装
 * 
 * 疑问:
 * ~先写了一个标准的JDBC
 * ~除了操作数据以外,其它三步都一样,将三部分别封装了一个方法中
 * ~使用封装后的JDBC修改了标准的JDBC,也OK
 * ~费劲的将驱动,url,用户名,密码放到java的属性文件中
 * ~疑问?为啥要把这些url,用户名,密码放到属性文件中.框架:将一些经常修改的,配置放到配置文件中,所有的配置文件:属性文件(properties和xml)
 * 不参与javac的编译.
 * 
 * @author 902-B-Book
 *
 */
public class DbUtil
{
	/* java属性文件;system.properties */
	private static ResourceBundle bundle = ResourceBundle.getBundle("system"); 
	/* 这个是驱动 */
	/*private static String driver = "com.mysql.jdbc.Driver" ;
	private static String url = "jdbc:mysql://localhost:3306/stu_a" ; 
	private static String user = "root"; 
	private static String password = "123456" ; */
	/* 从配置文件中通过键获取值,参数是配置文件中=左边的键 */
	private static String driver = bundle.getString("mysql.jdbc.driver");
	private static String url = bundle.getString("mysql.jdbc.url") ; 
	private static String user = bundle.getString("mysql.jdbc.user"); 
	private static String password = bundle.getString("mysql.jdbc.password") ; 
	
	/* 用什么方法可以只运行一次呢? */
	static
	{
		/* 加载驱动,是否每次都得加载,可否重复利用呢? */
		try
		{
			Class.forName(driver);
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		}
		System.out.println("-----加载驱动成功------");
	}
	
	/**
	 * 太想获取一个链接了.
	 * @return
	 */
	public static Connection getConnection()
	{
		/* 获取链接 */
		Connection con = null;
		try
		{
			con = DriverManager.getConnection(url, user, password);
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		return con ; 
	}
	
	/**
	 * 关闭所有的资源
	 */
	public static void closeAll(ResultSet rs,PreparedStatement ps,Connection con)
	{
		try
		{
			if(rs != null)
			{
				rs.close();
				rs = null ;
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		try
		{
			if(ps != null)
			{
				ps.close();
				ps = null ;
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		try
		{
			if(con != null)
			{
				con.close();
				con = null ;
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * 测试JDBC是否好使
	 */
	public static void testConnection()
	{
		String driver = "com.mysql.jdbc.Driver" ; 
		String url = "jdbc:mysql://localhost:3306/stu_a" ; 
		String user = "root"; 
		String password = "123456" ; 
		
		String sql = "select * from a_admins" ; 
		
		/* 因为要做资源的关闭 */
		Connection con = null ; 
		PreparedStatement ps = null ;
		ResultSet rs = null ;
		try
		{
			/* 加载驱动,是否每次都得加载,可否重复利用呢? */
			Class.forName(driver);
			
			/* 获取链接 */
			con = DriverManager.getConnection(url, user, password);
			
			/* 创建一个语句对象 */
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			/* 判断取的数据是一条还是多条 */
			while(rs.next())
			{
				/* 取数据 */
				int id = rs.getInt("id");
				String email = rs.getString("email");
				System.out.println("id:" + id + "\temail:" + email);
			}
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}finally
		{
			try
			{
				if(rs != null)
				{
					rs.close();
					rs = null ;
				}
			} catch (SQLException e)
			{
				e.printStackTrace();
			}
			
			try
			{
				if(ps != null)
				{
					ps.close();
					ps = null ;
				}
			} catch (SQLException e)
			{
				e.printStackTrace();
			}
			
			try
			{
				if(con != null)
				{
					con.close();
					con = null ;
				}
			} catch (SQLException e)
			{
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args)
	{
		/* 获取属性文件的内容 
		 * 参数是属性文件的名称(不含扩展名)
		 * */
		ResourceBundle bundle = ResourceBundle.getBundle("system");
		/* 参数为属性文件的key,key就是=左边的内容 */
		System.out.println(bundle.getString("mysql.jdbc.driver"));
		
		/* 使用我们封装好的JDBC来try一把 */
		Connection con = DbUtil.getConnection();
		PreparedStatement ps = null ; 
		ResultSet rs = null ;
		
		String sql = "select * from a_admins" ;
		try
		{
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			/* 判断取的数据是一条还是多条 */
			while(rs.next())
			{
				/* 取数据 */
				int id = rs.getInt("id");
				String email = rs.getString("email");
				System.out.println("id:" + id + "\temail:" + email);
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}finally
		{
			DbUtil.closeAll(rs, ps, con);
		}
	}
}
